﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>

using namespace std;


//namespace wnf
//{
//	template<class T>
//	class stack : std::vector<T>
//	{
//		void push(T val)
//		{
//			std::vector<T>::push_back(val);
//		}
//
//		void pop()
//		{
//			std::vector<T>::pop_back();
//		}
//
//		T top()
//		{
//			return std::vector<T>::back();
//		}
//
//		bool empty()
//		{
//			return std::vector<T>::empty();
//		}
//	};
//}
//
//
//
//class A
//{
//	public :
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//	public :
//	void fun(int i)
//	{
//		cout << "func(int i)" << i << endl;
//	}
//};
//
//
//class Student;//Student定义在Person后，需要这个前置声明，否则Person中的友元声明无效
//class Person 
//{
//	friend void print(const Person& p, const Student& s);
//	friend void test2();
//public:
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		//cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//		return *this;
//	}
//
//	~Person()
//	{
//		/*cout << "~Person()" << endl;*/
//	}
//protected:
//	string _name; // 姓名
//	static int count;
//};
//
//int Person::count = 1;
//
//class Student : public Person
//{
//	friend void test2();
//public:
//	Student()
//		:_num(200)
//	{}
//
//	Student(const Student& s)
//		:Person(s)
//		,_num(s._num)
//	{}
//
//	Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s);
//			_num = s._num;//浅拷贝
//		}
//		return *this;
//	}
//
//	~Student()
//	{}
//
//protected:
//	int _num;
//};
//
//void print(const Person& p,const Student& s)
//{
//	cout << p._name << endl;//可以在类外访问
//	//cout << s._num << endl;//不可以在类外访问
//}
//
////class Student;
////class Person
////{
////	public :
////	friend void Display(const Person& p, const Student& s);
////protected:
////	string _name; // 姓名
////};
////class Student : public Person
////{
////	protected :
////	int _stuNum; // 学号
////};
////
////void Display(const Person& p, const Student& s)
////{
////	cout << p._name << endl;
////	//cout << s._stuNum << endl;
////}
//
//void test1()
//{  
//	Person p;
//	Student s;
//	print(p, s);
//}
//
//void test2()
//{
//	//基类Person中定义了一个静态成员count
//	Person p;
//	Student s;
//
//	//静态成员变量
//	cout << &p.count << endl;
//	cout << &s.count << endl;
//
//	//非静态成员变量
//	cout << &p._name << endl;
//	cout << &s._name << endl;
//}

//class Person
//{
//	public :string _name; // 姓名
//};
//class Student : virtual public Person//注意虚继承的位置
//{
//	protected :int _num; //学号
//};
//class Teacher : virtual public Person
//{
//	protected :int _id; // 职⼯编号
//};
//class Assistant : public Student, public Teacher
//{
//protected:string _majorCourse; // 主修课程
//};

//int main()
//{
//	Assistant a;
//	a._name = "peter";//此时可以直接访问
//	return 0;
//}
//
//int main()
//{
//	Assistant a;
//
//	//菱形继承带来的数据冗余和多义性
//	a._name = "peter";//这是不明确的
//	a.Student::_name = "sarah";//需要指定类域
//	a.Teacher::_name = "John";
//	return 0;
//}

class Person
{
	public :
	Person(const char* name)
		: _name(name)
		{}
	string _name; // 姓名
};
class Student : virtual public Person
{
	friend int main();
	public :
	Student(const char* name, int num)
		: Person(name)
		, _num(num)
	{}
protected:
	int _num; //学号
};
class Teacher : virtual public Person
{
	public :
	Teacher(const char* name, int id)
		: Person(name)
		, _id(id)
	{}
protected:
	int _id; // 职⼯编号
};

class Assistant : public Student, public Teacher
{
public:
	Assistant(const char* name1, const char* name2, const char* name3)
		: Student(name1, 1)
		, Teacher(name2, 2)
		, Person(name3)
	{}
protected:
	string _majorCourse; // 主修课程
};

int main()
{
	// 思考⼀下这⾥a对象中_name是"张三", "李四", "王五"中的哪⼀个？
	Assistant a("张三", "李四", "王五");
	int b = 2;
	char c = 4;
	int* ptr1 = &b;
	char* ptr2 = &c;

	return 0;
};


//class Base1 { public: int _b1; };
//class Base2 { public: int _b2; };
//class Derive : public Base1, public Base2 { public: int _d; };
//int main()
//{
//	Derive d;
//	Base1* p1 = &d;
//	Base2* p2 = &d;
//	Derive* p3 = &d;
//
//	cout << (void*)p1 << endl;
//	cout << (void*)p2 << endl;
//	cout << (void*)p3 << endl;
//	if (p3 != p2)
//	{
//		cout << 0 << endl;
//	}
//	if (p2 == p3)
//		cout << 1 << endl;
//	if (p1 == p3)
//		cout << 2 << endl;
//		
//	return 0;
//}


